/*
 * Copyright (c) 2023 Cshoo Org. All Rights Reserved.
 */

package org.cshoo.tattoo.authorize.domain.service;

import lombok.extern.slf4j.Slf4j;
import org.cshoo.tattoo.authorize.domain.po.Menu;
import org.cshoo.tattoo.authorize.domain.repository.IMenuRepository;
import org.cshoo.tattoo.embed.infra.utils.UserUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * @author 杨翼
 * @since 1.0
 */
@Service
@Slf4j
public class MenuService {

    @Resource
    private IMenuRepository menuRepository;

    /**
     * 判断菜单编号是否存在
     *
     * @return 判断结果
     */
    public boolean menuCodeExists(String code, Long appId) {
        Menu menu = menuRepository.findByCodeAndAppId(code, appId);
        return Objects.nonNull(menu);
    }

    /**
     * 添加根菜单
     *
     * @param menu 菜单
     */
    public void addRootMenu(Menu menu) {
        log.info("menu:{}", menu);
        menuRepository.save(menu);
    }

    /**
     * 添加菜单
     *
     * @param menu 菜单
     */
    public void addMenu(Menu menu) {
        log.info("menu:{}", menu);
        menuRepository.save(menu);
    }

    /**
     * 修改菜单数据，这里只修改uri，name，description属性
     *
     * @param menu 菜单
     */
    public void updateMenu(Menu menu) {
        menu.setLastModifiedBy(UserUtils.getUser().getUsername());
        menu.setLastModifiedDate(new Date());
        menuRepository.updateMenu(menu);
    }

    /**
     * 删除菜单
     *
     * @param id id
     */
    public void deleteMenu(Long id) {
        log.info("id:{}", id);
        menuRepository.deleteById(id);
    }

    /**
     * 根据appId查询根菜单列表
     *
     * @param appId app id
     * @return 根菜单
     */
    public List<Menu> findRootMenuByApp(Long appId) {
        log.info("appId:{}", appId);
        return menuRepository.findRootMenuByApp(appId);
    }

    /**
     * 根据appId查询菜单列表
     *
     * @param appId app id
     * @return 菜单
     */
    public List<Menu> findMenuByApp(Long appId) {
        log.info("appId:{}", appId);
        return menuRepository.findByAppId(appId);
    }

    /**
     * 根据父级菜单id查询子级菜单
     *
     * @param parentId 父级菜单id
     * @return 菜单
     */
    public List<Menu> findMenusByParentId(Long parentId) {
        log.info("parentId:{}", parentId);
        return menuRepository.findMenusByParentId(parentId);
    }

    /**
     * 根据角色id查询菜单,即查询这个角色有哪些菜单权限
     *
     * @param roleId 角色id
     * @return 菜单
     */
    public List<Menu> findByRoleId(Long roleId) {
        return menuRepository.findByRoleId(roleId);
    }
}
